import Storage from 'react-native-storage';
import AsyncStorage  from '@react-native-async-storage/async-storage';

let storage = null
const defaultExpires = null
const createStorage = () => {
  storage = new Storage({
    // 最大容量，默认值1000条数据循环存储
    size: 1000,
  
    // 存储引擎：对于RN使用AsyncStorage，对于web使用window.localStorage
    // 如果不指定则数据只会保存在内存中，重启后即丢失
    storageBackend: AsyncStorage,
  
    // 数据过期时间，默30天（1000 * 3600 * 24 毫秒），设为null则永不过期
    defaultExpires: defaultExpires,
  
    // 读写时在内存中缓存数据。默认启用。
    enableCache: true,
  
    // 如果storage中没有相应数据，或数据已过期，
    // 则会调用相应的sync方法，无缝返回最新数据。
    // sync方法的具体说明会在后文提到
    // 你可以在构造函数这里就写好sync的方法
    // 或是在任何时候，直接对storage.sync进行赋值修改
    // 或是写到另一个文件里，这里require引入
    // sync: require('你可以另外写一个文件专门处理sync')  
  })

}

export const initStorage = () => {
  if(!storage){
    createStorage()
  }
}

// 最好在全局范围内创建一个（且只有一个）storage实例，方便直接调用

// 对于web
// window.storage = storage;

// 对于react native
// global.globalStorage = storage;

// 这样，在此**之后**的任意位置即可以直接调用storage
// 注意：全局变量一定是先声明，后使用
// 如果你在某处调用storage报错未定义
// 请检查global.storage = storage语句是否确实已经执行过了

export const globalStorage = {
  save(key,obj){
    return storage.save({
      key: key,  // 注意:请不要在key中使用_下划线符号!
      data: obj,
      // 如果不指定过期时间，则会使用defaultExpires中指定的时间
      // 如果设为null，则永不过期
      expires: defaultExpires
    })
  },
  load(key){
    return storage.load({
      key: key,
      autoSync: false,
    }).then(ret=>{
      return ret
    }).catch(err=>{
      console.log(err.message)
    })
  },
  remove(key){
    return storage.remove({
      key: key,
    })
  },
  clear(){
    return storage.clearMap()
  }
}

